import numpy as np

def auction(p, won, q, e, w, he, hehe, hehenum, x1, y1):
    """
    实现拍卖算法的Python版本
    
    参数:
    p -- 当前价格向量 (物品价格)
    won -- 当前分配向量 (每个物品被哪个投标人获得)
    q -- 投标人队列 (非零值表示在队列中)
    e -- 拍卖增量 (小的正数)
    w -- 价值矩阵 (投标人x物品)
    he, hehe, hehenum, x1, y1 -- 记录拍卖过程的变量
    
    返回:
    p, won, q, he_out, hehe_out, hehenum_out, x1_out, y1_out
    """
    hehe2 = hehe  # 保存传入的hehe值
    
    # 找到队列中第一个非零元素 (第一个投标人)
    non_zero_indices = np.where(q > 0)[0]
    if len(non_zero_indices) > 0:
        i = non_zero_indices[0]
        ii = q[i]  # 投标人编号
    else:
        ii = None
    
    while ii is not None:
        he = 0  # 重置当前分配总价值
        # 从队列中移除当前投标人
        q[q == ii] = 0
        
        # 计算每个物品的净价值 (价值 - 当前价格)
        net_values = w[ii-1, :] - p
        j = np.argmax(net_values)  # 找到净价值最大的物品
        v = net_values[j]  # 最大净价值
        
        # 检查是否可以分配物品
        if (w[ii-1, j] - (p[j] + e) >= 0) and (won[j] != ii):
            # 如果物品已被其他人占用，释放该投标人并加入队列
            if won[j] > 0:
                # 找到队列中第一个空位
                zero_indices = np.where(q == 0)[0]
                if len(zero_indices) > 0:
                    k = zero_indices[0]
                    # 移动队列元素
                    q[k:-1] = q[k+1:]
                    q[-1] = won[j]  # 将释放的投标人加入队列末尾
            
            # 将物品分配给当前投标人
            won[j] = ii
            p[j] += e  # 更新物品价格
            
            # 计算当前分配的总价值
            for i in range(w.shape[1]):
                if won[i] != 0:
                    bidder_idx = won[i] - 1  # 投标人索引
                    he += w[bidder_idx, i]
            
                    # 更新历史最高总价值
                    if hehe2 + he >= hehe:
                        hehe = hehe2 + he
                
                    # 更新记录
                    hehenum += 1
                    x1 = np.append(x1, hehenum)
                    y1 = np.append(y1, hehe)
        
        # 获取下一个投标人
        non_zero_indices = np.where(q > 0)[0]
        if len(non_zero_indices) > 0:
            i = non_zero_indices[0]
            ii = q[i]
        else:
            ii = None
    
    # 返回更新后的所有变量
    return p, won, q, he, hehe, hehenum, x1, y1